package ru.mirent.entity.listeners.platform;

import lombok.extern.slf4j.Slf4j;
import ru.mirent.entity.Observable;
import ru.mirent.entity.Observer;
import ru.mirent.entity.notifications.FixtureNotification;

import java.util.ArrayList;
import java.util.List;

@Slf4j
public class FixtureObserverService implements Observable {
    /**
     * Список зарегистрированных слушателей.
     */
    private final List<Observer> observers = new ArrayList<>();
    /**
     * Список всех полученных уведомлений.
     */
    private final List<Class<? extends FixtureNotification>> notifications = new ArrayList<>();
    /**
     * Имя фикстуры.
     */
    private final String name;

    /**
     * Создать фикстуру.
     * @param name имя создаваемой фикстуры
     */
    public FixtureObserverService(String name) {
        this.name = name;
    }

    /**
     * Отправить последнее уведомление всем слушателям.
     * @param clazz отправляемое уведомление
     */
    public void sendAction(Class<? extends FixtureNotification> clazz) {
        log.info("test -> fos: {} ()", clazz.getSimpleName());

        notifications.add(clazz);
        notifyObservers();
    }

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
        log.info("Слушатель {} зарегистрирован", observer.getClass().getSimpleName());
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        Class<? extends FixtureNotification> notification = notifications.get(notifications.size() - 1);
        for (Observer o : observers)
            o.update(notification);
    }

    @Override
    public String name() {
        return name;
    }

    public List<Class<? extends FixtureNotification>> getNotifications() {
        return notifications;
    }
}
